<?php
namespace my;
use think\Env;

/**
 * 要求安装phpredis扩展
 * @author 清风
 */
class Redis{
    protected $handler;
    protected $options = [
        'host' => '',
        'port' => 6379,
        'password' => '',
        'select' => 0,
        'timeout' => 0,
        'expire' => 0,
        'persistent' => false,
        'prefix' => '',
    ];

    /**
     * 架构函数
     * @param array $options 缓存参数
     * @access public
     */
    public function __construct($options = []) {
        if (!extension_loaded('redis')) {
            throw new \BadFunctionCallException('not support: redis');
        }
        $this->options['host'] = Env::get('redis' . ENV . '_host');
        $this->options['password'] = Env::get('redis' . ENV . '_password');
        if (!empty($options)) {
            $this->options = array_merge($this->options, $options);
        }
        $func = $this->options['persistent'] ? 'pconnect' : 'connect';
        $this->handler = new \Redis;
        $this->handler->$func($this->options['host'], $this->options['port'], $this->options['timeout']);
        if ('' != $this->options['password']) {
            $this->handler->auth($this->options['password']);
        }
        if (0 != $this->options['select']) {
            $this->handler->select($this->options['select']);
        }

    }

    /**
     * 写入缓存
     * @param string $key 键名
     * @param string $value 键值
     * @param int $exprie 过期时间 0:永不过期
     * @return string
    */
    public function set($key, $value, $exprie = 0){
        if ($exprie == 0) {
            $set = $this->handler->set($key, $value);
        } else {
            $set = $this->handler->set($key, $value,$exprie);
        }
        return $set;
    }

    /**
     * 读取缓存
     * string $key 键名
     * Mget Array 返回数组
     * get string 返回字符串
    */
    public function get($key){
        $fun = is_array($key) ? 'mget' : 'get';
        return $this->handler->$fun($key);
    }

    /**
     * redis 验证值是否存在 Exists
     * $key 存在返回 1 不存在 返回0
    */
    public function exists($key){
        return $this->handler->exists($key);
    }

    /**
     * redis 删除 del
     * 删除成功 返回 1 删除失败返回0
    */
    public function del($key){
        return $this->handler->del($key);
    }

    /**
     * redis 设置key的生成时间 EXPIRE
     * * $key string 键名
     * 设置 成功返回1 失败返回0
     * EXPIRE 命令接受的时间是秒数
    */
    public function expire($key,$exprie=0){
        return $this->handler->expire($key,$exprie);
    }

    /**
     * redis 设置key的生成时间 EXPIREAT
     * $key string 键名
     * 设置 成功返回1 失败返回0
     * EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)
    */
    public function expireAt($key,$exprie=0){
        return $this->handler->expireAt($key,$exprie);
    }
    /**
     * redis 查询key的剩余生存时间 TTL
     * $key string 键名
     * 当 key 不存在时，返回 -2  , 当 key 存在但没有设置剩余生存时间时，返回 -1 ,  否则，以秒为单位，返回 key 的剩余生存时间
    */
    public function ttl($key){
        return $this->handler->ttl($key);
    }

    /**
     * 哈希 写入哈希数据
     * $key         string  键名
     * $hashKeys    array   数组
    */
    public function hMSet($key,$hashKeys=[]){
        return $this->handler->hMSet($key,$hashKeys);
    }

    /**
     * 哈希 读取哈希数据
     * $key string 键名
    */
    public function hGetAll($key){
        return $this->handler->hGetAll($key);
    }






}
